#pragma once
#include "SymbolTable.h"

Symbol* Scope::lookup(const string& name) {
    auto it = symbols.find(name);
    if (it != symbols.end()) return &it->second;
    if (parent) return parent->lookup(name);
    return nullptr;
}

bool Scope::addSymbol(const string& name, SymbolKind kind, const string& type, double data, Value* alloc, GlobalVariable* gv, Function* ft, BasicBlock* bb) {
    if (symbols.count(name)) {
        return false; // 重复定义
    }
    symbols[name] = {name, kind, type, false, data, alloc, gv, ft, bb};
    return true;
}


SymbolTable::SymbolTable() {
    enterScope(); // 全局作用域
}

void SymbolTable::enterScope() {
    Scope* parent = scopes.empty() ? nullptr : scopes.back();
    scopes.push_back(new Scope(parent));
}
// 退出当前作用域
void SymbolTable::exitScope() {
    if (!scopes.empty()) {
        delete scopes.back();
        scopes.pop_back();
    }
}

// 获取当前作用域
Scope* SymbolTable::currentScope() {
    return scopes.empty() ? nullptr : scopes.back();
}

// 查找符号（从当前作用域向上）
Symbol* SymbolTable::lookup(const string& name) {
    return scopes.back()->lookup(name);
}

// 添加符号到当前作用域
bool SymbolTable::addSymbol(const string& name, SymbolKind kind, const string& type, double data, Value* alloc, GlobalVariable* gv, Function* ft, BasicBlock* bb) {
    return scopes.back()->addSymbol(name, kind, type, data, alloc, gv, ft, bb);
}

bool SymbolTable::isGlobalVariable(const string& name) {
    if (scopes.empty()) {
        return false; // 无作用域
    }
    
    // 获取全局作用域（第一个作用域）
    Scope* global_scope = scopes[0];
    
    // 直接在全局作用域的符号表中查找（不向上递归）
    auto it = global_scope->symbols.find(name);
    if (it == global_scope->symbols.end()) {
        return false; // 符号不存在于全局作用域
    }
    
    // 检查符号类型是否为变量
    return (it->second.kind == VAR);
}